package ioc

import (
	base_tools "gitee.com/youbeiwuhuan/taotao-tools4go/base-tools"
)

// ioc 全局日志对象
var log = base_tools.GetIocLogger()

// DefaultContainer 全局默认实例容器
var DefaultContainer = NewContainer()

// Register 注册实例至全局默认ioc容器
func Register(bean any, opts ...ComponentOption) {
	DefaultContainer.Register(bean, opts...)
}

// RegisterWithComponentName 注册实例至全局默认ioc容器
func RegisterWithComponentName(bean any, componentName string) {
	DefaultContainer.Register(bean, WithComponentName(componentName))
}

// Get 根据组件名从全局默认ioc容器获取实例
func Get[T any](name string) T {
	c, _ := DefaultContainer.Get(name)
	return c.(T)
}

// Inject 使用全局默认ioc容器中已注册的组件实例 -> 注入到指定实例所依赖的组件实例
func Inject(bean any) error {
	return DefaultContainer.Inject(bean)
}

// InjectComponents 注入默认ioc容器内组件所依赖的其他组件实例
func InjectComponents() error {
	return DefaultContainer.InjectComponents()
}

// Shutdown 销毁容器
func Shutdown() {
	DefaultContainer.Shutdown()
}

// AddAfterComponentRegister 添加组件后置处理逻辑
func AddAfterComponentRegister(acis ...AfterComponentRegister) {
	DefaultContainer.AddAfterComponentRegister(acis...)
}
